// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using DotNetty.Buffers;
using DotNetty.Transport.Channels;
using Nethermind.Core.Extensions;
using Nethermind.Network.P2P.Messages;
using Nethermind.Network.Rlpx;
using Nethermind.Network.Test.Rlpx.TestWrappers;
using Nethermind.Serialization.Rlp;
using NSubstitute;
using NUnit.Framework;

namespace Nethermind.Network.Test.Rlpx;

public class ZeroNettyFrameMergerTests
{
    private class TestFrameHelper : ZeroPacketSplitter
    {
        private readonly IChannelHandlerContext _context = Substitute.For<IChannelHandlerContext>();

        public void Encode(IByteBuffer input, IByteBuffer output)
        {
            base.Encode(_context, input, output);
        }

        public TestFrameHelper() : base()
        {
        }
    }

    private static IByteBuffer BuildFrames(int count)
    {
        IByteBuffer input = null;
        try
        {
            TestFrameHelper frameBuilder = new();
            int totalLength = (count - 1) * Frame.DefaultMaxFrameSize + 1;
            input = PooledByteBufferAllocator.Default.Buffer(1 + totalLength);
            input.WriteByte(2);
            input.WriteZero(totalLength);

            IByteBuffer output = PooledByteBufferAllocator.Default.Buffer(totalLength + Frame.CalculatePadding(totalLength) + count * 16);
            frameBuilder.Encode(input, output);
            return output;
        }
        finally
        {
            input?.Release();
        }
    }

    [Test]
    public void Handles_non_chunked_frames()
    {
        IByteBuffer input = BuildFrames(1);
        ZeroPacket output = null;
        try
        {
            ZeroFrameMergerTestWrapper zeroFrameMergerTestWrapper = new();
            output = zeroFrameMergerTestWrapper.Decode(input);

            Assert.That(output, Is.Not.Null);
        }
        finally
        {
            output?.Release();
            input.Release();
        }
    }

    [Test]
    public void Merges_frames_with_same_context_id()
    {
        IByteBuffer input = BuildFrames(3);
        ZeroPacket output = null;
        try
        {
            ZeroFrameMergerTestWrapper zeroFrameMergerTestWrapper = new();
            output = zeroFrameMergerTestWrapper.Decode(input);
            Assert.That(output, Is.Not.Null);
        }
        finally
        {
            output?.Release();
            input.Release();
        }
    }

    [Test]
    public void Sets_data_on_non_chunked_packets()
    {
        IByteBuffer input = BuildFrames(1);
        ZeroPacket output = null;
        try
        {
            ZeroFrameMergerTestWrapper zeroFrameMergerTestWrapper = new();
            output = zeroFrameMergerTestWrapper.Decode(input);
            Assert.That(output, Is.Not.Null);
            Assert.That(output.Content.ReadableBytes, Is.EqualTo(1));
        }
        finally
        {
            output?.Release();
            input.Release();
        }
    }

    [Test]
    public void Sets_data_on_chunked_packets()
    {
        IByteBuffer input = BuildFrames(3);
        ZeroPacket output = null;
        try
        {
            ZeroFrameMergerTestWrapper zeroFrameMergerTestWrapper = new();
            output = zeroFrameMergerTestWrapper.Decode(input);
            Assert.That(output, Is.Not.Null);
            Assert.That(output.Content.ReadableBytes, Is.EqualTo(2049));
        }
        finally
        {
            output?.Release();
            input.Release();
        }
    }

    [Test]
    public void Sets_packet_type_on_non_chunked_packets()
    {
        IByteBuffer input = BuildFrames(1);
        ZeroPacket output = null;
        try
        {
            ZeroFrameMergerTestWrapper zeroFrameMergerTestWrapper = new();
            output = zeroFrameMergerTestWrapper.Decode(input);
            Assert.That(output, Is.Not.Null);
            Assert.That(output.PacketType, Is.EqualTo((byte)2));
        }
        finally
        {
            output?.Release();
            input.Release();
        }
    }

    [Test]
    public void Can_decode_neth_message()
    {
        byte[] frame = Bytes.FromHexString("0000adc180000000000000000000000080f8aa05b8554e65746865726d696e642f76312e302e302d726332386465762d63396435353432612f5836342d4d6963726f736f66742057696e646f77732031302e302e3137313334202f436f7265342e362e32373631372e3035ccc5836574683ec5836574683f82765fb840824fa845597b92f99482f0d53993bf2562f8cf38e5ccb85ee4bb333df5cc51d197dc02fd0a533b3dfb6bad3f19aed405d68b72e413f8b206ae4ae31349fc7c1e000000");
        IByteBuffer input = PooledByteBufferAllocator.Default.Buffer();
        ZeroPacket output = null;
        try
        {
            input.WriteBytes(frame);

            ZeroFrameMergerTestWrapper zeroFrameMergerTestWrapper = new();
            output = zeroFrameMergerTestWrapper.Decode(input);
            Assert.That(output, Is.Not.Null);

            Assert.That(output.PacketType, Is.EqualTo(0));

            byte[] outputBytes = output.Content.ReadAllBytesAsArray();
            HelloMessageSerializer serializer = new();
            using HelloMessage helloMessage = serializer.Deserialize(outputBytes);

            Assert.That(helloMessage.ClientId, Is.EqualTo("Nethermind/v1.0.0-rc28dev-c9d5542a/X64-Microsoft Windows 10.0.17134 /Core4.6.27617.05"));
            Assert.That(input.WriterIndex, Is.EqualTo(input.ReaderIndex), "reader index == writer index");
        }
        finally
        {
            output?.Release();
            input.Release();
        }
    }

    [Test]
    public void Can_merge_big_frame()
    {
        byte[] frame = Bytes.FromHexString("006a5ec28080000000000000000000002094c10844fa022090f901aaf901a70183016e1bb9010046010000200913008009070400400108005001059601000002112700101109fe010009010588c201000d850004093909db0008090d0901f03cf89df89b947ef66b77759e12caf3ddb3e4aff524e577c59d8df863a08a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674da00943620100042aa0621b00010190bc8066a062f5669702289f891823d76b2984bcabff54c28e5707e300a4fc91e4d5aab0c7f97aad010d0132ad010df4000009094ee301150135ad0901321a017a01007290013e1d00297952010011bb5a0100329300fead016ead01000476ad019048d41aa0a25049f63fb1d0dd2142dcca659b9a0f024c3800dede31a0cd53e72f02e7bdfff935ad005b525a030d0105f20002ea5a03ba010005706a01003ead011501327c013e01005566050129e1323100fead016ead01825a038853a00879faae3be6fb05e94e1735d5df7f6db727a9b209daa06631d1173244e9aa76f936ad015e25011118252536f4003a3d03360100721d00aa010005781d012e1000119c321500a2010000282e2a00fead016ead010003765a03905c0e9ba0dcba26994b312a8f2b25b83b33ba110687c7c4e674e6a4368b65c2438f958af2f936ad015e010031112525ceb406be0100cd585e010005881901321f033601002e2f02366602fe5a03fe5a033e5a038840a0a3f170e843f15a46306a6cbaee2dcf1ecab0dfca863b47567b742deba4c14d5af9b6ad010041210afead016ead017aa50111013aad016a01002e5307fead01fead0176ad01883ba0e1070d9127562e9da3611cf2ef7bde94952732d9db3ca863f7694094ad10bb4ff9b6ad01252536f4002ebb02420100721d001d012e53013201005abd0105880d0171f63215006a0100369400329503fe0705f20705888aa060bd62384f7917d063d1f201f461b0c8fcd6f17af0d1f58bf7a71008c66b22c5f98aad0104100035112525fe5a036e5a03010132400156010005888e0100324c00366602fe0705fe07053e07059028a0625372ae8243568b9b1781f4fd43305e04d8f4d9474b468a3a1d1bfc5620074df903541a680d860e0a00004dbd36f40072010036c602363b0100003e1e00110162670319010040594005012979520100757956010032ce01fe5a036e5a0382bb0ba808a048efdd24ede4feda0c347125b7cbc68be9199a1f637cfd8b0bbac9395a1a5c9af901a7018302dcb6b96a220111ef45cf465703111f4201003aaa01e201003250015132b2010021cc36630201123a3d02feaa016eaa0182b80b8815a0787c163880dce2bef053d1e04dc43afa95db49731d8fa94c363b62d35eb6b17ef9320405258c4e0100318e052136f4003e90013258013e1d0009012927ee010005880d01119c321500a2010032af00fead016ead0182b80b8879a0e1bb6a52aef623b7ada22f78fae2324fe928909ecb64c64b87a788a76ca66eacf932ad0162010031112525465a0362010052ad0125ed6ac7038a01000588c2010005791501493339ad040400fead0172ad01825a038802a001b28945b68741a379213e0d7a69fc93bd69a02e6a24e4f10c916718052fd96bf9fead019aad0139143201005aea095e0100356efead014ead010000fead01f6ad01987fefa0da3ae50c5a6bfabd5ceb294fc612c977b39ec4389611287dab8d62e7b8e783d5f90354f9c1b40001e25e08523d031e3a085a1d00ee010005012ead0171f6040040ce6e0055464109fe0705f207058868a0143bf2a54eb7df942f1a158c94c447e8297029c56d6ee3bdd069afeaf79b8385f921aaf25e08894e36010029360906fe01004601002eaa017e010079bb218d190109b635aa0101feaa016eaa017e0405887fdca04aeba5b604ce81e33cce146cb704b7f8a5c7e46247bb1dbd2c8d948c75384e7e261d19a6b50bfab106aeab062951320100257caead011901fead01fead0176ad0188d7a0bd4e2ef1fc2c493ba520a7482c032581b77a5a07d7d79bdf1faecfc2afdcf686f966b1062e55019168252532f4002e26004601003a5a0332c702ee010005881d014ad501110111bb010125e9360100329300fe5a036e5a037e620d88d3f6a075fde30f63257583acb65ee0c8de85fb24caebf88309806d444a68c4215bb0f9d5b1046ddb821d191edd0c005036af016e01003aad01fe010015013ead01960100326602000229e131ad25d4fead016ead0182070588c4a0990002233f5712556800923de52a58631405caa5957d705037f6173b407fb445f9c9b1003676aa014992252232f100768d013daa363600fa010005880d01256401012e1500420100299846010031aa0501feaa016eaa0182620d8859a0425a499934be35468ed00b5ee8e93bfa87f83d167128ec843b14619028ca54f0f96604052e010031112510cab1063db5fe010005010588a601000dbf36300229bf35ad418efead016ead0182570388b1a028bbb04cc06d21ab924fc84ab7665edcee919a01da121982dfcda0d491e9bc9bf9fead0132ad01424401fea5013ea501110142690092010039ade16729ad00182e3a00fead01f2ad01889ea0d6c6aff66735d4305d2c7b7c8de01cf5435bcd98bc40d7b7bcafd6131f294b84f962ad014d8e0901110d252519f401015a900109255a1d00e20100710805880d01119c321500a2010011520501fead016ead018207058848a01b5fa50d36909b7ea799cd9f357e5c299ae206a70314fb8af77b2fde60ec1e20f96e6d17811a090131112525b1078a8a018a2300660100056d5601006a1b006a010049411101695afead01a2ad01820705888ba02d557708ecd4ac32393f366f04825222b7d727959fd3708b8898b60db9c5a2b7f9165e08a66d1736f100360100091c35a115090901321701ee01003eaa010020421200150151655a0100329300fe57036e570382b50b88e4a0d866f8636791e5cefb81ab30024d9071729308e0f92438bb8be758dae32444d7f962040532010011f225257157110132f0003601003aad01fe0100150105888a0100493c01010132190e0101fe5703fe57033e57038878a08cf5fe4207bafb417e751de79769a7d52bb746cbd97e36504d299a9232571305f946040501d73e010032ad0109f431881108520100721d00ea01002ea400119c3215004a01001528320100326a02fe5a036e5a0382b1068837a084dba10e557feb4a5ac1282f7fdebb14b09f274e753f94a66b5bef0158f6496af9be04053e57036a010021aa2e5601fe010011015a54003277014601004963110165570040323300feaa016eaa0182ae068873a057e16c68fb03fbcd35bbb00fc70e420ee13a8c7a82a77f68dd08a3e162805b32f9ee0405a90421915e0100051c5a5a01d201006d1cd653004aad0136e001fead01f2ad018860a082e8d94c3ef4ec6d3b42c0ab1c07b2b271bae823d4b743d12ff32487cdccd7bbf972ad0135142d240911ba5a03ca01000e010d72010015994a01004521520100fead01fead0176ad01884da0458ed86f07381cab97215a75a15a0d4090ba398dbf9eca3c5143c60d983551def972ad01150132ad0136f400720100000a361e003274044a01006e84013201003e2900002015a242010011bb5a0100329300fe5a036e5a03820b0a88d2a03ee4721e4734f8b99a836c4017299dde3f4d62fc136e6459e6f55c188453dd54f9caad01ee5a03655a322101d201002ead0122080e825700366602c5b4363500fead016ead0182b406883aa08410ceab8f2aa751fdf61bea4deaf19a40011251f8b002ed52afbfd453a21a28f9caad01001032f50066760422241efe010046010004400039a4753b2ec201a201002ee2010008fead016ead01820b0a8826a0c5548462d123ca85ccf14be10ee46aecec2fafe7e7507906c154d96742785761f9caad01ba5a03828106050149e89e01003d98965f0005013265020d722ead01fe5a03f65a038827a00193e1cc72e50bbfea823ca1ada60e2e8f68dbfd0ab063a02820d32d2f607db9f9fead0136ad0155e61aaf3572770392010036610111013dadaa0100364c00491ffead01fead0139ad8814a0f4dcb6277b576d1344a172e313b32109f98cb92656425e39ec3192b81d255a39f9fead0136ad013e0100eead0129ad1901d59c1efc1c4e010001713694011d01361900fead01fead013ead01880fa0171bda1ac2eb8f25785389da959a5e0ec92e63849dd60e5da4ca6fdce0a83c69f946bf104e0100713245d236f400211f620100721d00ae01002eaa013aad01119c099d66010005bc42010000082e5b03feb406f2b4068815a0aa4aaf65987fa5ae49dff458208a700dd83954597dd30c1a4929a3be170a38b9f9bebf1036aa017201003aaa012e1601f201003d76055469233e010025df35c9560100053fadb2feaa0172aa0182b80b88c0a0c433fc3ad9da0d56c0a5b854cd0b8650aa0f01975ff1e5d2529ce6a6b4617d3ff9fe04053e040536ed073aad01fe0100150121adaa34020d0136320029e131ad0501fe57036e57037eb80b887efca050aca4a9391233f4a7ce91a5ab16d91658ec238bcf09a5815b4dd413d626437dfe7f26467f2632a001110d36c301ee0100090121ad3a01004a13003e0100fead01fead0176ad0188e9a0d95e7995a6ea85d823f2b83b2d67505ee4b2af9d322c54a4cd9f62d0fd35d46df9eeb106c5b172010025ad858e050100081d0cf201003e9a016926360100ad000d075e0100fe5a03a25a0382070588b6a04cd3ddbc49e56b7e4f15363c636dee2216e84a419565d0f1950d151dbcd037caf9d6b106311d258d5e0100321d00291536dc02da01002eaa01358b2e1500a2010009950d01fe04056e0405820f0f8804a0eee9bcdf283d302cc043712f94e2306d72cb27701b78aa8c0330c9165fd90d24f9ceb10632e10072010032ad01fe01001d013a98019a6305362802496e1dcc0001fead0172ad0182b10690d6a0bc64bcf2b630fada7a391183ed60f434f995114d4d40ec7b8a29a6bcc93ea626f9044dc2e538babc101101391729276a01008221003aad019a01007aad01fe0b0a760b0a82ad01a8c3a057197284ca4b71efe51eb5bf8ca9fbecf80c7c54d8cd1919b60475cfd0f3d4e5f902a0018304ff60b93a9d02003025008a19032d01052a8591000831490d1a150139ad8201003e3b0005010563150100802a18140040e1133de1016a04400061702ed60001160d010d1701b0088000800d3af081f90195f89b94112234455c3a32fd11230c42e7bccd4a84e02010f863a0ce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82a0096e2240be03d6804812ff7b63ede4bb6fe19f1e44d0c231a85b67e964463ac4a09baf1e07f520199b833b0d1d3733b68c45304c80acc5bb2ffa6af89478a98bd6a000000d9e6000000079073fc2117dd054fcedacad1e7018c9cbe3ec0bf87a569d00f04342a0335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0a006363f16fc0be1b72c8a8bf3be9af16421c387e75a7d68c3bfec91178fb16637a0017411015a7c005217008842a0b59bb806875ef5718727778ded48d6def0daadc637571c2265f9eaee20aaa024a011570101507633a1e4c27eab9491a1861b76363ca4bfb3ad7ca07e19016e010b5d1400801a0d09457f3641021d263601000127621d00fa010005880d01416905012e1500a201005db9fe50047650047eaa07b00df5a0fb70a4b05a8ee7788082a040b2e00657988e20edecc2e3960cb054702622200ff903aef901080182520c6e282efe0100fe0100fe01009a010004c0f9a15e0803e5d53e0c018972327a02002009143a010041a11a5d19090b625e056201000001bd29420100197500023e9c02a15405016e5e0509955601004df50d63fe5e057a5e057c69e31a4b00b5ecd4de3f5389cf674893db12b4b4307056796505d01b18ea8aaa32704852cb04e65e057c2d2b1bdcbe79740e57e534445eac934d9cc641817e5934f6c7302070a781fb3f8e7c00529300ba5e054cec4078078e6c85d1cad1669fd66d2f7d85d6c95882190108f902b66eae092dbe31cd4925daae09fe01002e01008a4905323705090136af0209dc05274dacfe5b0bf65b0ba8b0a0f3730d9296280a5c601d649c48655fd956748b090587a98878de8afb23c26074f90109018301c067b91ac108fe0100fe0100fe0100ea010000c06e17081d0131da4531feb902feb9025ab90286ce0136b902002412a04345b9110100f8feb452eab452987eaba04a2cac39e1362a42b53b08532043828f781032d09085192e037edc753f940939f9010bf9fe1708fe1708fe1708fe17082a17080404fead74126f55f56a89911501febb02febb0246bb021192ae010036bb0209e300082e4100febb02f2bb028898a04a3336516295e38b93f34e40f6c0effd75068223041200665fb60119781be522f916261400763ec4092e01003118856536f10072010032020a0e4f2416b60ed60100057d09011d0b0501297652010011bb5a0100feaa01a2aa0182d01588a4a0762b632ac622cfe210fd08e265f7f8716804c1e37324ba1be3857afcff61a824f921aa08044a91daaa013a8d013601005a1d007a3e01520100329d0100441d23154d3222009e0100feaa01a2aa0182260e88e4a056ae34678eb7a9e46f003d526a32ed74a14a01d61edfa718722e458aab14a24bf9ced0159e0901526c3c3dc0866e075e0100d298013a1004698b35ad018dfe0105f201058885a035d2e6731c95f8b1fb41d789abbbd11c38c6302fcca9aee16a8fbabf8eaf89d0f9fead01c2ad019a010075305201004aad01357666010036bd0535adf5a3fead01f6ad018872a02be9f83df26fe7b13210571b272b279ca9474fa27270cbc9e832e32aee1b98b8f976cf0d1101313b252536f4007d2a460100721d007a0100056c5a01002e1c000d9c00013215003a562366010032e401fe5a036e5a0382070588d3a05daef9766987a2f89d44d63207cbb06a77959e179cde7d6321b0781006da932ff9fecf0dfecf0dfecf0dfecf0daacf0d4d224d1d090f0050660702110151b11108b60100361a034e01000d97ba010036580095661901feb9026eb90282361a885fa0b6f13fc43a4b7c3ecdcee5fcc0a4e17850f947daae790572378512e766e98508f9ca130601f4c1ee8a01002dad0132010132d30319019a4d001d013ead01297952010051685a0100329300fead016ead0182170b8892a054d7432def2927c2f6f60f8123cc2ac641c6eb9a39603b623bcd9d32ee84f6aff9caad018a5a0311012dad6d9315013e6c01c20100d641005134099729e1fead01a2ad01825a03884ca071b831b611a35b47767bb01ca5efe75f3f28b95589343d485427b19966f2981ff976412409d13a8f1515f405013590050111310d01361d007a01007a04032e01002ead0115372e1500a20100fead01a2ad0182c00788c2a0d723c531d149620a423759d4d32986287d682fe8a3a05d2abaaa6915f0667e6bf90e710ef2c44f660100b2aa015d121d012e4b01150cd295013a6302495515530101fe04056e04058257038847a0467948cb560fe96dcbbeb781be7649feef75cab76e2c2a70b24094a2d092343df9fe04059a0405fe01003a010039ad29733a010052150066ad01152ffead01f2ad018834a0d714d6dbd30ae8a7ee0a8d915f957f3d176239920329c895611a56ca12755d03f96ead01f9f6916825256e04053a0100b65a03055e9201002e2a00119c3215008e01000545fe5a03a25a0382040588b1a02669d25c5355243dfcf1dfe91b02fa5023d66247cb95e8f901384b95601f7d84f96ead011901311105e0c25e0839f57601003606026e010005883201008e3c003624006950fead01a2ad018207058821a051a4cc4313ca9b07278d6311a86f399a947a09ed547b94c9d5593397a03ff55ef986ad0101cf32ad0136f4007201003a5a03014be601003df43ead0129793e010005b60505660100329300fe07056e070582b80b8880a0c06446c490f52dbd04f8443f132d626e5d648a793e5b2fa6556aeddd445c32b8f946ad014e8c0111f22525c25a033601000544ce01003d58d6440036da0029e11d55fe7813fa7813880ea0e133b33c6079779c2476b43afed9ca1c920cd9e8076dcb244cf1a659554f5cadf935ad12d31b5e010076ad012666140501112d56d216fe01000501a6ad012e8d01fead01fead0172ad01887dfba0ef9a1408980c570a0fc20436a126e979bcc98c0ef91e009e9d629abd34812b88227856fed25926d2592e13013a0705fe010015013dad1d0b7e01002e9a00165e3d000132cd01fe07057207057eb406887de8a05d55cb31e40e67de1a280394e3b0514a42a2631049405352543c5b7defdb66dc122a1fae650d36f100728d0100423a7203fe010011010040ddbd75c6aab40119012e7703feaa0172aa01820b0a88a0a0bb054ed3ca12cfe3d62b73a222330ca6b23c7cf7967f81a21695ba30dcef612ff9b504de295d728f0172ca01660100360f024a0100d298011557c9ab0906fead01a2ad0182570388e3a070c372db8f70b641c9437504c5c35dea386be78c27f14bd1d67c893c0e04deecf9caad01824b0112c42005013aad01321a016e0100752e5a01003ead012979520100424b00361100329300fe0b0af20b0a886ea09cbcbcbdb8c5ac10105176786df121f752e97fd31bee3a98794c980725327a34f9761614a9d73a1614fa0b0afe0100215f3ead012e0100664c02361a0029e1014e1501fead016ead01825a0380d0a043b8c8278c311c9229eadc1f683159ad5f872ab04c99257e52c4221c5f13041e57387a295d0901252236f1003a3a030101290401014a1d00fe0100050105880d016d2712ce54c67000feaa01a2aa0182b1068891a03f14b66bb3f663009a3784e700169a1d65d1d645992b45aaf8aa1679ff2e8488f9b50446b50b3d952d11292500501258342e0100399e3a0100c63d019601002ead01a601001dd19531fead01a2ad0182570380bda04d95e0cc8cad3617e5d54c472a99c22952e890c002ab2c5b64db00f06eb647721a4e1dc83ead0105018a3201fead01fead0142ad011d9149621de5fe0b0a760b0a82ad0188aaa0840fadcc0fdae7f3d6baa2cae466c0a92afdce6dbeeee562d41653ce06904a17f9755a860b0a0040795a6e01002a530b3ec74ffe010015010040d24a00fe5a03fe5a03765a038097a09faa69635b0b1e83b7aca1ee3557e957ec50580abf52dee8ba1daf1b701751b2ad011ee81d36f4005dac460100721d008a010049fe4601002ead0171f611159674001e6f0cfe5a03a25a030003320b34420100905c0d80a012adff02e7a44ce1b347bc35c6ca653b12bdd7e6612feff2ad88c90ba47b2f0df9755a46b4061d011e1f3b25253dad35295a01003a390100485a2700c2010005881d015ed5012ac60a5a0100fead01a2ad0182c315885ca06590259c94e0046e9eb0e7af6a9597ce480d6f1921715d2c6145e3c8b4004b48f935ad860705615a219efeb80b7eb80b6a7a01110132ad013270016e01005d66fe6108fe61084a61088884a08d1b14d0d2ed672ab14dfd700b8e2e928182a4b373c8684e8f445348adba7709f966ad012e694521a401012525fead017ead018a01000040268c10aa0100fead01fead0176ad01887fa0a32d6be3f4fa6420dd7bba280c5d338d449e28b85623f18a8dce94f1fca9f8dff93643335e010032ad0136f4007201003a0705a204037e010045351d015e8d0322b27d3a89001901329300fe120f6e120f8207058852a00e7900589a74e1ff344c81e68da59c253e0967654f3c1c9e2ac770ed2b16f97ff9162823a64333a2570300103a2101622f01c201003eaa0196010036630225de0010feaa01a2aa0182b80b886ca0afcf5726efe83ebb8cfb3fb7e4281f1aef1a83a8440d0f61774172467bea239ef921aa08044ad18a4333000125220014321801727f01000236b402fe0100150105880d0171f0321500a20100feaa01a2aa0182080a886fa0e1a28b41d601c004abf1e04125be813f044d2ff868cfff0d040f7e807285553bf966ae062e01003111252562570332f900050172ca012e010005590501190a6a01009225004201004a570336b400fe01056e01058257038859a048342545f1edc16bafd237451562b1f32f96825ab6f1de117d4e8c05baacec5df97ec015090196ad014601004aad01363201da01008aad012e960f0d01097b1194a504fead01fead013dad8846a0951e02ac80de4dd320c07f04336c467a1a4d24e60599a5cf5af9d902d55438bcf9a104fe711c5a711c3116fe01003e01002eaa01514605157dda1eee0e46010029a409011d31fe6612766612820405b05ea060c338436b6b0e8a12a70e6b6224c5b34f93680e0ff0634897f6c589a7af14cdf90285f902820183025e30ddb135000030190b22432100202e2a01010149ae2e010000043aaf023e01001142000226790b46450042120000021137050100010166050101293574451f150e1d0104044001290d1a01e131b3013f0d01f03cf90177f85a94dc0884f78b17913d4ee7bfcd046e13407ffab56bf842a054acb82a9e70d7c289b149758d23167c915428ae854a7aa4abe5bf2f4ef29f36729910f03e616d69f680f89c9464fde89bae3e52b3b853a0ba8f8184d72a398f5bf884a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef325c004c9533d5f75d6ff12529331fcca7fdee660fe15d1b3221004c32e5d066767dbfe5b64b77d2b09113ae7839c2b93221004a01000c2a80f87b56fa008863a04f79409f494e81c38036d80aa8a6507c2cb08d90bfb2fead5519447646b3497ea02e5000ba7d00185af3107a400080268b420e9411319b42010021b80101450a328c07111a5601004516da01006e5a000588c201005d72fee70ffee70f4ae70f8033a030a2884066ffdf701429d1c48105bedd6c2457935151054ae2e78f00d28a3cd2390915f4664405111a3aad016db35a010011358a01003ead0162660226071e5a0100329300fe39096e3909823a0e8840a0faa7c014a3c7fa5129cd6fe9867ae42d59b8684fcdbc77d12dadccc12d0f21e3f9fee60a26e60a32f7000d013aad019601008a35002eb564a601005566050129e132b600fead016ead0182e60ab020a0c680c671e1606686f1a0805a271425daec89dbde8523928a97a3483cf77dd769f9040ef902610183030fb9fd8f8e010081a609f0920100aa37030101015e5e010021cd3e5b03a2010009394a030b0ecc15f03cf90156f8b994f0ce7f5075a1419e6ddb75d8e7118999042dcbffe1a0cff3cf4c6525a5d629f6e2ff46d4ddb2d8d3deca13a243852bb07a5fa538e458b832b3004c43152a3c4678b44e5f6a54d8a1ff1f5ca2b65a230163520100102386f26fc1521a002e010001f76e01000804f8995abb008876a527b8f997064f142eb87b35d9520a142e7fc5254e0ff2bf34c6a4ba15f558b860001d594c3a5fb887a98c72cec9882b9ec5e6b5c0980650781d1f4201000c5d3478fc421500360100000112112808047e146e640200801ac40925a2326b073e0100052215017e18015a010036ba034a01003666009e01003657006921fe1104fe11049911b01ba00a140c8a860676c7d44067a63dbb080ecf2bc6b7e0addd0177deca6d8066d246f901c8f901c50183027b836ead014a0100610009f0920100fe11043a1104e2010072e70104f8bbfe10048d10b25503fe10048910769435190121b8010100420105727803360100da78038201002e91012e0c007601005e780311defe8907f689078808a05d836d5058da55f37ea245c1c6c0a09fdc39ce041badffa0c9fc9f4ae1293d37f92236090e900c15b63e01001119251925ad050a8201004aad01ba8103560100967e003e01005ead011501fe3609ee3609887cf5a0c19b603dc89cd878fcdd96404f17ffff272dba0077acc6ce4bde8fe5d738c80f363d0e3e010015de32ad01151605013213063e01003aad01722c0001019e85013e28006aae0511bb5a0100329300fead016ead0182900c882ea002e3877116a4007ae9949a50b517ed435a6b90eacecc9e545e9368d7a0f8da63f93ec9153a5f010d0111f2252536ad013a31003639033a1d009a0100116e66010005880d01152e2e1500a20100fead01a2ad01821f14884da0629db809f2d40eaae3bf0a45fcd606adb61fcdd63d13d59ea9c0cb93908a5fecf9bec915a504960100d6aa012e0100567f015616007ed40f36630200204556feaa01a2aa017e3a0e887ce2a07d8387d48fdb281b44951677ce7640ff7394f61ca76474ec787d1b47ecfa7872b904fe2823fe28232628238a01005ead0176b00139ad61fda938000801341101fe04056e040582ad0188cfa0c25b3f734b7e0829c3bb48622f95152d0f23122b03832bc5819b2c42754632a0f9225e0896ad0101d77e5a0395951ab945e201001d493a01000588320100217f7e010039ad0101fead01fead013ead0188bca0d75d03b8c48fa05629c3155afb89de47d052e1fd8c514fbeaa4c39b70b4afe9cf9baad0181d87ead0119010008012ffe01004e010046ad018e010039ad0140fead01fead013ead01b0b7a023e4d9cdd2c4bfb6b9ec30c9f1a6cf22e0e66a8f05cdda9db856b992e9580423f9010bf901080182520cb9565512fe0100fe0100fe0100ae010000c0cea63b368f2242ab312e01003abb023282054e010041538e01003e2800498752010066ad040501329300fe15066e150682190b881ca0b04c167e53e8cd45c320877118f78065c0673b729c93e155c60fc8925b134512f9fe6c09fe6c09726c095601003eaa017601001ed81499650101122635feaa01a6aa0182bf0788a4a0016444888c66e2eb81825e76e58a648274e24249811fb491cf705ded7b56783af9561206e50d15dc0040559c2525a612063e5703fe010015010588c2010015d10501698bfe5703a2570382ad018891a009230de771f7b5532bdd858f7c64b3d60ff427f3c9ff2e4cc4ccd2f8ed844f92f9c5120c8082ca97ba4115fe0100fe0100fe01004e010000c0be270c210551bb3aef0526bc211901422300fe01000d01125509c20100febb02febb0276bb02887ea028fd0f7062647554023401b52f7da3227589550ee7b794eeaedef47d8f1e752cf995680e8514010136d2000d01f10431ad69a4860100fead015aad0142202496010036db0009c4fe6804fe68049968886ba0dd81c5809028cf740ded77bfa2da6bd4af297da48702d427ecab5bd418be3800f935ada6d40d36f4007201003aad01321a019e01003a4400050145351d0129795201005168420100093409930d25fe6c09f26c09880aa0afb85fb6f41192eeaed794f2b33dea653a935aa9ef5a2e0ab84a19e7b5c5cb42f93e85145601000dcd00042525b1075601000d2b01010004526901fe010001010588c201003666022ead010d01fead016ead0182c2078853a05b33a9c75d3c7096f1b9dcf202de848fa8333a70293fe1bc5164cf31d6078515f9fe190bfe190b4e190b36550142010031aa11084e010012300a320100365500feaa01feaa013eaa018858a0177a9a7a8b6ce143404deff5b365abb25da593d6152f527ea8ba86f13e36c521f9126c09febb70febb70febb70febb7026bb7000b5fe8c10fe8c10fe8c10fe8c102e8c1061c67a796db14565367670053201003ed906465a03d6010005888e010032810061c601040901fec603fec6033ec6038840a0a19b6a3b51d491f652bbd9f9a137f4f05e5c1b8ca45922f31027fca2fc9b8ff2f9fec603fec603fec603fec60336c60304037016932704995aba410e41ce29fe920100bab502015e5e0100418fa2bc023e01000939563e15fe93272a9327fe8323ca83230002fe93271a9327b24e28180000005d34755a01086e010000f90ec9640803eb66ba6402fe0100fe0100fe01004e010000c07a51751101710245b1d92e41fd7201008221006601005616030d0105883a0100d9085e01003622008930164b0d0d01fe9e0bf29e0b882da0fefe2b5bf764cee7eaf4ad6745ad29bf6a34c6ed1a9680a2386a53af06fad6edf941b97ad807fe0100fe0100fe01009a010004c0f91aae2908033fbcbac80341cc29fc920100fe2c063a2c06e201004ef3021501feae2922ae29b2700596ae2972c9030ef61a263b1b1e7c1352010021b80101250936cb03111b5201003a840432f103ee010005880d0101556a540272a0000000fe388fa6388f7e3b1b88d2f8a08902435cc6d02fde00b003e73a5503bd6248756173cc945c7ae261c899ba5d53125c0c00025a30502107224f2200802922d92e8201003aaa01fe010015012eaa01a6010036630229de000816a83a0901fe2e06f22e06801aa0f515c99369004ca0556244803bb616d8fdfe335b3213723fbda4972d108f0fa68e3409e9252529ad2dc7760100fead01fead0192ad010ddcfe1d3c7a1d3c8279138807a07237347b24be070feabcba512aba0132bd4575b7bf1b6e9fb50fe0019a363e28f942261552780691493dad6e010005270101fead0176ad017ee2053e010049711101755a1901fe5a03ee5a03887bf4a06d50f69a3eaca216ce5e16ca2eb04e1a9f7654582b2601fd251146686f8ed784ad04e2ffa909f232010015133aaa014a8b0335d5b201003e3600157146010051655a0100329300feaa016eaa0182ae0688eea0a3186daecd7d97102ba5d888bf6736262ba42eb5d63bb5036a5147326ebebcc2f95e2a1a360f0111f20516a9049201003aad01000056b5031ef158a601000588c20100fe5703fe570376570388efa0cd2d73f190f671c3c37f15b6a816f4bface6fe5faa31a492a89dbe73219049dcf95ead013668295aad01000801276e010042ad01fe01000d01d6ad010012327e00698e32c300fe5a036e5a037eb106887bdca0811d76ce22ebe9635e5395bb8e766ee634ab347362f6a6cbf4ed04bc7c4745bd56de204264015aad014e0100323c00320d00fe01001d01d6ad016a5a0329b4fead01f2ad0188c9a048270935cd7bb1609908f74534ba8105e38d10c52302f8df52fb96fc29a510cef9425e0852010032ad010e9d2809dd8201003aad019a36005e010039a3190a0901692652010011bb5a0100329300fead016ead0182b40688dca051d8da16af021f95cf5a8723fb1f6ae3ef3355bde40c208c590fdc5a7584dea4f90ebe19aed247eeb106a601003243013eea0636aa013a2b006201006a57030901feaa016eaa0182040588b6a024b7f73b4bd2c99532a83cbbf471510cc116f22692fae2db422cc18567df0675f91abe1904698fba8312fe0100fe0100fe01004e01002cc0f9018af9018701831adee66e0f017aaa0362010026650c221a0d997800081d1f05015d91de71001d5f2ef60f0501858a1d644601000cf87df87b52954088f863a08be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e07e414800003221005499c842718aa0741548582080c96324b0b525418b80f91a111f04a4276e8c01fe0100fe0100fe01009a010000c016b10d0412826e0c01512725d6fe53059653050101454a4e010005887a010001b4362800fe5305fe530576530590a3a08ace4b22dd1fa2278ff708c7c071f402c07e4b20ca3732b20941f90e7a14015ef9010c129f1b0804063d6ead01fe0100fe0100fe01009a0100f2442c8a0100b9413e4005ee010000103a94025e010041be2e0100febc02febc0276bc028890a06dd5d84f1c6bb19bfc78a6f960af08d7d692ba31be73edc7ebc2e498e0472a72f96ac00e1d0111f765b9fe6904a669046201000588960100f57a00001a739b110189c6328607febc09f2bc09908ba0fcb383cb67776bde5c5d2cb816dce9dc9850342df3a1371c969c5276ae6ff91ff90354c516ae567151a129076d3d563f010d1da2010026de087601002e6e005149321500a2010032a50bfead016ead01821c3f883ca06f67675d7548bc2b31953a6b60a6ff9ed89c61a77045a13665183e352dcf0fd9f976130d05cb310e2522fe5703ee57036557000409885132a2010036310071571d01feaa016eaa0182130d8878a0fc34b0d58737241a896eff41d7b8a33957593a1eb94d0162393b0fb532bdc765f9edc00839a69dfec007fec007fec007fec0077ac0072e220432bc023603027201002e44000e481e01055e010089b596010065441d0149882e0100157a11bb5a0100329300febc026ebc0282791180caa024229b680aad51c39bc518838450f115305505910766ecb39295e49d43042d2a89484e5732359711f22525fe6904ee69048569a6fe0535b3050115cf050129e1fe51e5a251e58269048865a01d76b96ac99d901126a67b23448ca0ae76f53eaeda67d3a057be6b94ce44a767f9fe6d09466d092905090100820907520100364901b601004535c201004ead01fe5a03a25a0382ad018852a04a1db3dab98189c322e01b9f0c0d806343c38590f0c5edddda80508f404ee1caf9fead0146ad012e010000032e0d007e01006e6a09366801fead01fead01fead0152ad01883fa0e5efc603e17498f3ebecbbc88cf012bfa5d83b973561319d299bb8029bfe8957f9fec307fec307fec307fec3073ac30722bc674e160615014e16062e51042e01002e0504ee4d046e01002e6400a60100001032f50209c0fe6904fe690499698827a034c18727b0bc4535eb049064032a5d3c31adbe6711f10889e308732e66186648f976290c050132aa01001005135201009d29254d3aaa01321701c20100295b0501055d1d011d1b3e010011bb5a0100329300fe6d09f26d0988b8a027ac3d459cbbedc077581b038c73e10e2d6defaddef1ffbc6cb13bcbbfe0b547f921aa96bc6729220050a6c10a3aaa01fe010015013eaa011101769a0036630229de0088113b0101feaa016eaa0182bd07882ca0bf16c7b1f6fccb42f325c5a100f56ec39f9a581357d8813353d2e2a238a876a6f9f5bda69f2bfe170b9a170b294d11013687012ed680a601004ead01fe5703a2570382ad018814a0ca53be54a3b5ebda00c66c2360bb34f9186664950e805aba1703a3884be171a1f935adc2ae068e0100a65a03369b017e01005e5a037601004ead0100182e7a00fe5a03f25a038001a0617fa8ed0b70370b69bb2bebecd08b8d84777e4fbda3e430912367f6d6f5db2a0eed6a5a030002b5f62525fe5a036a5a037a5e06150105880101b2e4014ead01fe5a03fe5a03755a887aeea0000342135ba2bdacc3ef78c0a5a4547cdb3a12dfa3974e19e9420c58b2219122fe15a6fe15a6fe15a6fe15a63a15a6eeba9d12ba9d7201003a6804512859a255848201002ac7091a4a081d016ac202196c52010011930501fe68046e680482d91288a6a046106ec6c66ba20591349549ad6fe96b47d41362a07cd104d1055307e18bf0d0f90e3836083b14f8fe9215fe9215fe9215fe92157a92152e010031fe45689e740500023634224a010036a3086a7e023e01000588c20100fe7405fe740576740588dba05779bccde43d4b2a3f688b1f471711640c0f0288cf9d99f647a0e20e24f95ad4f922ce081c1bb901000000000000004e010000800d1500400108005001050000090c7a010000027a20007a0100056f4e01000440084e16007e010000103221000020050e324900f03cf89df89b947ef66b77759e12caf3ddb3e4aff524e577c59d8df863a08a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674da0054f660100042aa0661c00d0000000bc7ac8a07f652e8ce6d19186d5fe009a4bb51932f2e8d655635b27cd9ff0665960a6dd9af90354f901a70183016e5bb9010001365201004ead018e010062ad01363801b6010000203e29029e4d00362800fead01fead013ead0188c3a01c706350c1cacdd76756e6f13844527283795e30b43aaf2fa6c8e23b9a74e285f921aa0c02dcb6b939aa09c50501090b32aa0136f100628d010101721d00ea01002e7003119c3215007201002e3e00fe5703a257030003765703b85c0d2da0c5e13021fce9d08cf1bcc522e02e626ff7a311c6f07bd9f7f242f0f9da22de34f901aaf901a70183016e5b3dad420100311105e7ad048e0100e6ad01117256010005881501327101460100555d150905014987323c00fe0405f2040588b0a01454892f519cc972d036be8a57aa32c4bbdc428d7b3ee1a3cf961ecba588332bf9caad0136f4007201003aad01211a3a13003601009e5b0031ad2971000015084a010076f60105931501fead016ead010004765a039048d294a0af540497bb9405263b221925d64cb4e08b21ea8101fe77d1c567abef37f7a76af9caad01d25a036687013171ae010031ad0101a64000368400093841401501fead016ead01825e08889da06ce11b95a9240a28e0ce1126ee7808c6e99c9f30a6dddbf4f1b760d87e140b09f9fead019ead01321501ee0100050121ad367b018e01003632000420040134329800fead01f2ad01888aa0acec0b370c3c497ca53ce3d84496a0a9badce3e209cbf02e4cab3b6d17a62d73f935ad001ba2b40636f4007201003af404321a010d017aa7041d011d2a21ad00001d1169265201001d364e0100329300fead016ead01820705888aa0f9b6f623227190d39a8ee700ea45b3544d7479be566a92208551b002aeef11baf935ad66b80b00202d1700081a7109d20705fe010036010029adbe010036660229e135ad010ffead016ead018207058877a008788e94be79c7e92a1239cd6c63974c4cf108a6c8e98f6db5ecf5bba7f8f0f6f98aad015dc42525fead0172ad010041016f8201000588ae010065e372ad010101fead01f2ad018864a030fad52d61c42232ae35aa72aeb9ce8967230f3fe84e6ff93a30c8c169d3ce39f942ad01266e0d1d01914c2525fead016ead0155e94e0100057e0501190aae0100fead01fead0176ad01885fa0d716521ec08cfb3a803854d008e419a50cf3ef24a9c13b7803d3a709523504c7f942ad01520100d2ad0104080049d1320100114aae010081a2360100fead01fead01fead014ead01984ca02d7a744c5c627584b49c8164dd50fc56f45e1bc81c8a36574ffd63a568101d98f90354f90192150f65722525fe5a036d5a128d094e010062190019010588c20100fe5a03fe5a03765a039839a086d216db5bd924319899a42c4dfbd1069261e92c169c336985afadc6f7c77c74f901a70183366c12420100710d252205f18a4f01000042570395e215096e010011754a010005881d0146790315016a46000101328a00feb1066eb106820b0a8878a03b3e45b40dfb752f785d0bc59635b7e8f2ff2f7bd20bc6c9c60ee127349ae5acf952040565432e010011f22525fe57036d576601008609020588c201004566150129e12ead010008fead016ead01820b0a8826a0cb22c97bdc768cb08b96992466a6702f674b57cd2c01ef64f36bab02028dad83f9a204050501252536f4001265095e01003e1d00363b00e6010005880d0151493215008a01000138004032ad01fe5a03725a0382c615881ca014ca70b06b045cfef730633360481d5efc3f33826c7d7897e405ee36d8492361f9be0405fe5703825703150132d9012e9e012e0c00a601000011322b00465703feaa0172aa018257038813a095ad1ba1547b34be892411493ac379832cbfd24d3058aea201d33ee3062827eef9b504a6bc1076ad01324801695729740906fe01000901326500a20100368200fead01fead013ead018800a0ee804c6bb19f3cc814b48df36b74fc02196d0524c0b0943939ea7ad05df0d952f935ad42bc102e110181300101051476ad0132010029adfe01004601000588360100726b0029a709061101fead01fead013aad019879fba023a30dceaa6436c3585f0dda7504bb376797c36a41d04ca1693fa69a29725ad2f901aaf9a1070001aa5a0336f4007201002942f5c21509fe01002ead01217501045a0100516836010009990000fe1d19fe1d192e1d198866a07a2a7d99546c75e6036fa1b14668c3154cf52065e9efd9ed666b79c0f69e2b00f9665a032e010011f225255e5a0311251d0135146a0100aafc0115010588010186360a1d01366a0029e1324002fe0b0aee0b0a8879e8a026bb41d66a670351c86715e6f08dd69709b1ee566e78ad3cfe1782363ec81982267b21a6b40636f4003d9009f9354946650dfe010015012e640055242e15008601001a9c0c09b40d01fead016ead01820b0a880ba06c00e39c6360809d19340d40dfb59e7f67703bff510afad4aa0116658a11961df9a1040802dc76a21a195e57034a370b3dc71901b65201360100690cda4300366302094bfeaa01a2aa017e0b0a8879d5a052d3af3c53c3bbf32aa6db1cfe8e91206b155e3976afc1e99187063f9b58c985d9b1425e082e010041bb01dd256866ad0142010035ad05394a0100b2c40419015e4f00760100fead01fead0176ad0188c2a0b4bc1085145bc45f5186bc222172af613ed30ecb2539f48f8e407c732ccdce91f9360f0f21914e0100008009e90040252536f40072010035ad090132c702ee010005881d015eb8002ad5195a0100329300fe04056e04058269128854a0b6f9771ebb4cd420061bfde5169ebae6a98548ee671fdaf99b4995cd96760363f9a9042e7f2642010061570101252236aa013a8d0136b2222e1d00053cfe01000d012e4c00119c321500010192b303feaa01a2aa017eae06880cfaa092e2c158ccb0f71660fe8140e96b5641c2034f5d7566d5da374cec35ce48c3804604052ebe00359731112525ce0405fe01003a01000588b2010001c215cf0501698b2eef00fe570372570382b106b0afa0e99cf3cd0a94f78406fbd428b0e937075f0286dec76bdf47a19f391480f69074f9010cf9010901833a6a3a6e5e08fe0100fe0100fe01009a010000c059bca6170bfebc0282bc023250025201004ebc028636007abc020001febc02f6bc02889ca02c31a1af6c590bfca0ea7123fb61cf1dc9854026befb252cc29157ebc8009326f9fe710e2a710e4a01002e16067601004e7f010501528401622e0019014a38007aad01fe6904fa69048897a02bc85a4a21c49a3af9496119c94d576b8c301f4c38e1dfd15570f6fa6eccd504f9caad0136f400729001461d00a19e01011af00dda01002ead011152321500a2010000082e4b00fe6d096e6d0982c30788e9a0df82cdb164fae0757e256e6ceb38e46af62e71ddfe484483b002990fb8b3661cf9caad01bd077ed30846ad01fe010009012e62014a43034a01000132366602fec307fec3073ec3078884a0873ca76a11997b6034bee72a616b7b90b666ccb51a197598da7e779cdbb43b0df936c70c5e010051be01f33af4001d0146bb0139ad053a9658018a0100054e1d0129790d0136b50311bb5a0100329300fe5a036e5a0382c70c8842a0ddc6238df140b7358a40d6229d29c3c58c16c59ee91f8eac28de7bcecb5266c4f9bec70c7d577e010039aa3201007a3e0186010032aa01320d005a01000589fe5703fe57037657038871a0ad42376c4d3eb3bc49e064ffec728a7f6d1f4bebbddddaba35d0fe53d2621a46f9325703329e022e0100315e251836f40025075e0100661d00468303ae010005880d01119c321500a201006157154efe57036e570382b10688d8a0292b36061c39cfdf6162b740e504887da5c82b8620ff0febe0822f6b5fbeece4f9d6570315df6e010066aa01f60100327d00a2f5013663024597001021aa1501feaa016eaa0182710e885ea0255c3540fc3ac66ffb3cd8e72b9ca47f4ae19afc2acdb756cca5f8793afdd430f99e5b080480002115004001d8ee0405a904ee0100050105889a010059314aad0165571501fead01f2ad01884ba09e71014f557d3afb43a11396ec442feeda31108eb27635ffc4195367fe85b9e7f99ead0109012525f6ad01363201da010005884a0100b510520100157b658c655afead01fead013dad8838a0a2e28bcc3b7a744d68e1a9a1fd243925d8c99366bd78e3b44e589b8c3def4ebcf9fead01c2ad01fe010005012ead013da10010765d00361f0035ad797bfe5a03f25a038833a043546cbb4dacc9d0ae20e67872a8246c1012f6e169c58226604e815f3bba10e6f9325e086201003111252536f40001eb09f8000046d00b011d05011141fe01000d0105880d01155b2e1500a20100feb406a2b406825e0888c9a0b20dbdd515105a6f10af738209ec35ac22b9b770e565218e10d64d71e7e8fa79f9be5e0836aa0172010035aac5ef3617010501a24c000001052f11013e9501552b46010035c9560100feaa01a2aa01825f0db030a046dfd2eeda4e6655271ca4f497cb094a63baf54ce707a1d78ac18df6282997fef902b5f901080182520cb9360f01fe0100fe0100fe0100ce010004c0f941b80801c0676eda1731fd45302ebc0711195adc3d5db8fe0100050151660588c2010036250349ec11520501fe0f06f20f068820a015308fedf6c8a3a53b25114f6160cad1b1257a1e417a49e8acace99938b706b1f9d2bc0709e88a0100bead019e5900aaad013da21d0b555efead01fead0139ad880da0026d40d11a11a4b9807020eeae68209957b45c54a057bdad98fc93cb49c1fb13f9caad0136f4002e010042a80435ad091a321a0176010076b7013ead016a2e0079fc520100329300fe5a036e5a038212068826a0ea116b250d60df6310de440143e19e23badd1539ad34b4501eeb94ee7c69e2fdf9ca6909b1077a0701010135adfe01003a8e0136ad018a890005013666020953fead01a2ad017e1d108878faa09e234c7cf0e594981bbaa326d99f7677794a57c323e93005603acbba5882742ac5b1c2f83515015a8d0112d00d1d1d6958fe010011012eaa0135a82e15003e01003291012e0100321900fe57036e570382130b88b8a0ea66d8502a040d07c8e3bafa6fafa655733509d5c2c73aacd4e13e11a21b0b16f9ca040571575201003695014eca01291f0906de01006e9801660100fe5703fe570376570380e7a0209c5ffdf94e71938224c3b42d311d5035b6edd7ba14b71035e04205449242a6221a09e9252572ad01695211014ead01fe0100010105885e01003683001d0109c41101fe0405fe04053e040588cfa044459be5ac46e8129d72e635111101edd4b03baa02b99886da0c52695e64193af90eb50bae040529aa92850192250076010029513a01004aaa01b50b660100feaa01feaa0176aa0188d4a0858dc8ed58bbed30e1fc84389fc1694d6794533546abf141f1f50fd096f63ad7f9ca5b0836f4007201000002364301f2f9042e3d003ead0152d2010901368200429e102e5600feb10672b10600047ebb4b8814a01dbd12bd7ae3d1f3f73e3270781ddf6b5f6e8afe118074047bcad4ba59fdfcf8f96957a6442f39aa21316e3a0300206e1d0072010062c504090101791101358b2e1500a20100feaa01a2aa01825b0888a7a0b69a0ca30d900f593d00af19af404644291cdf9ea628a76b2064e364fbfe1060f9ba5b0801dca904920100e2ad017a01003e980162680001b0150159660101698b322100fe080a6e080a82b20b88bca0cca696de71f1177382bf161fc4f3682864b5d43505525e40086d6e3ce3aaceeff9baad0101e64ead0136ff09150100025e1900fa01000588c201005ead01154efead01f2ad0188a9a0c826b805066afe169e51dd7e23889154ec1ba86a4ec91d351d56c18912920316f9cab1063dad5aa401150159f200047ad904b60100355fb201005ead011501fead01f2ad018896a0a862a627a6d1bed07b1fac12da181c4d4a918781f1be099aee902810d1f9751cf9c9b1fef13016f1303a900139aafe01003601002eaa017eb106764e02bd040004feaa0172aa0182b1068896a0d8fb08fe5e851eceeef1126f90d0752c35b62a16de8e4cc046d0dd60f6d2c858f96a04053d79311125257d577e010036ad01763701ae010005884a0100766200fe5703fe57037657038883a0d650986c24ac44d9f12a3d0374497e51932b4fa58e75065d58bddeee20e77fcef96aad011d0132ad0136a14272010036ad012ec702f601003ead01162a082e0100359905bb05055201007d5afeb50bfab50b8802a0efc57367d72c43e9e00c1c3df5dcf5417d759a69ba733bc1a62748807f749e88f9caad0100506afc003a01003aad013201007db9c201003ead015601003ea30135c1050129e1fead01a2ad01820b0a8870a01f4801a4d46c03d8dda24aec7fcdb5817efeb5ba9ddc9f5915d9057aa0c09d15f9ca5e0836f4006e9001761d004601007284012ddd25822e2900051101012e1500a20100fead01a2ad0182b4068885a0cf71aaa1afe4e50a8a55ba889298b5a7b27e71fd9c801d8ffd08a334fd110624f9665e08497a2a3e3a250dc9b132e3005e010072c701be0100057d09011d0baa010036630209dd32c700fe080af2080a886ba01f5005b84ae3c77142aeae3cdebcf0d3f7694c709b17c5d793cfb9ba151725d5f9c60405000829ad2e010062d507fead0132ad011d0186ad01756d1d01fead01fead0176ad018058a0046dcf3c5f7fa2ba925630f4a972ff705b9154e44af6d85ea54f1bd828f26efe39336a0100251afead0135ad69010554010186ad014e0100153f0501fe5a03fe5a033e5a03b045a007a713bd7d3b360fb3b248c2b43a4499c2f54b9fa17c6eca1712f38b05325d89f9044df902a001830393093e222309cd356f15090901293e0501210400802e021422e735011a6a01004efe020e335b097a4a01003a8400162f2605010040c1cf1d38019f04400061f32ef6031d210d4c0d830d19f081f90195f89b94112234455c3a32fd11230c42e7bccd4a84e02010f863a0ce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82a0096e2240be03d6804812ff7b63ede4bb6fe19f1e44d0c231a85b67e964463ac4a0742c0bc8152fc0e66a4dec4400bcf435c6e2de36d86681fc72ddd8b2028e131ca0000005cd05015479073fc2117dd054fcedacad1e7018c9cbe3ec0bf87a569d00f04342a0335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0a07b689a1a3d548f912e96fc2c8ea2e8b751eecbabe2a923b27572f225fdc3c1e7a005750d015a7c005217008842a0b59bb806875ef5718727778ded48d6def0daadc637571c2265f9eaee20aaa024a00d560501500434ef9ff3ca966fffe15d3764199a977e882ed6a07e190112141f080501643ea3022e01002dca21f6460c2a6a01003a540241391d01d61604010100400d8b11014d634e010000803a84003a0100329300feaa076eaa077e631888d1f0a09703fc8c93b0e0f64a33d7104627f1b0add92ae8f050a3e219830e153a4eb682263d3e82fd450101255f362604720c013a1d00053ffe0100010100c01d4551499a5e002e60043e1f1afead016ead0182010b9074a0b0df7d23fc52528067ab75465e8bc6e6f2ad56f2588be8284506c67eb46859d5f902b6655afe7c6cbe7c6c3a010046c6013612023e01000930762400460100363000698efe5a03a25a03825b0e9832a00201eee8e698746c64ce84c952cd2732bb933b448e433592c24ebe514492ab2cf9010901837ac92afe0100fe0100fe01009a010000c026ba4d6a6604001075ca453146100c62010000029afc033653028601000588c20100366600feb902feb9023eb902881fa07c8c5994344ca7106b7e387d34a07918186ceeab94f3d884b04c63082b0d7673f916670fce761e01013af3051d0100101ec509fe010032010025a505050d015a10060e710a8a0100fe6304a263048210068865a0b1ee5f6d2324ac00a01b6d35fd0c90be39a5796aaf6d90b3192c8a27fee6a3f5f9c6670f765703361c0721ca49bf1101355bf201002ead01a60100fe5703fe5703765703880ca0b73111e2dbc041fe25288ef9365ea03c71f2b175ae42a39f559dccf38fb58c46f97ead01216f0e4e0d090125259a0405012c093efe0100460100015cc601004ead0100092e4700fe6a096e6a0982bd078007a0b77503e641bd84dc2fb90d5b8fc1ad0f031bedca7c34348d2a14347541f2e32a54496ab1063aad0136f40072010036ad01000899749aa5045e010039ad69ca36be033201007acb031993fe7219fa721988d1dea006b328ba129eba276a46ff0ec9563ba7935c7d3bffe16faa1212cba17e019ccd925e0872ad013690013a0100321d0029a1aaeb0166010039ad199c01150963ae0100fead01a2ad0182b4068854a059b17812326248f85a33d95f09e58eb22565a27391edebd996337b8988d34054f9165e087a2320499e25220050a60a0132aa0172010009609e010005886601005a1f00362502698bfeaa01a2aa017e0405b877f4a0cf43d1da4d48a6b6e7a5f79ac244e057c8b5fe3579ddacd00e50e94294bb9f67f902a3f902a00183039349b9894f1501002012b211256f764a012d04052a05015e6b14291f3201000020322e01328200195015014213000004124e140e3f5861511d600c08000010466b144601000dda0d3afe6b147a6b147c8213dd788f123c4e45f2bca883ab7fb4cd55c491f0b4b3b03b8a67c2feb66e0a324d2a52d813e66b147caf68f0896eeb026cd9a14e728eeeea9cedab82d39e2616061ee209b7f30291ef8e7c00529300ba6b144cdd9cab275c3afd873701984725e80128cd49bc4982190100f91e1411046ddba26e14325304411e660100425702aa01004d3a52010000402a0c17a601006d4f0d010960fe5304fe5304995388e1a002fb51c12133a635f67d34cc48779e9dd9968d00ab059f3fc42594696400ebd5f912141104bfe76eaa01fe0100fe0100fe01009a01002a1411feb753eeb75316b7533658027201005aed064e0100ad41010136610049b9008801191101fe100cee100c8877cea0a34d541a688b4296d0d420e5a0fcb5c6302096fdafd30b3200a87269c57f3482127715aece5e36f100724604721d00769e047201002eaa01358b2e15001d017667008d630907feaa016eaa0182600ab043a09a095c90736eeef6b8af9c6b7e83936adcbe1c2caa66070b3f4658d654f6c104f9010bf9010880829f6fb9323308fe0100fe0100fe0100d201009d65fec80e8ac80e4d21ee01000d0155a6892a11072e291c498d2a3a0d56010011270501febb026ebb02828c1b88cca0e94809023defe973d1ec4bd2452aa29f900dc4e4bb3e6e30e52c3763e1cc87b9f9921b0d090125220050090c7a010000080e3c0b726504ea01003aa06e9a0100361e0529e5feaa01a2aa01821b0d90bba07393328a9e501d7d24637d5bc6f0f8fd2adb49d843a09cb61d4f9eb19d1d17d2f902a31a862100893ecb0809cd666f01092059ca000209f9048000621b0d05010020ea3c171d8dc908b5ee4a1b0d415a00011e3b0d2e010000087d871a7f1d0dccfe1b0d7a1b0d7c31731894d5bb153aedc4c494b7b7a51967c9f999c18f057a931f543409be40d28e9f0c00114e23228a86217cda3f2b4431393caa1c76cc2020a7dcab01462501d875233a3c6eaf806965c1508e7c00fe1b0d0e1b0d4cb899cb88ef9a97c54ae70f63607a3d80402e6a5d82190166dc1f55010101491425f912d70f1d015d3a36340001010d1d36cc03ee01000d0185db0d01119c321500a20100fe5304a2530482b8088832a09d447e801d84d7b8e053f0d320ce02a48b8c3d8526583fa1db9b59eb7448198bf91ec80efe0f0cee0f0c1a0f0caa010029ad3250028a010036340289471a1f18094bfeaa076eaa0782000688a8a0a516b4fda5594b57741ed8203be22d9b19b6bb4b11b844015b00d853ab6ff39cf912c80e04c0273efd05fe0100fe0100fe0100ca01002a2b1932c80e29c8190171ca453196b90805018d66fe010042010005885a01003e740059af190a010149b9fe6604a2660482b90288a3a0df9ce4bd153e361f655a7b1298defcf4162cca5900a870063494436fb5cb2fd4f96af0301ddc32ad011d187e01003a3901321a0119013e1b0242010042b90d3ead01297952010011bb5a0100329300fe66046e660482100c88c2a04e3cb7da4ae5d1f4f6de41a3a443573a40696e657ef02081b3c3171f76245698f92e100c5a860111ef2522fe57037d575a6f008201000588c20100366e0000220540feaa01a2aa018257038890a0ac1f24d759efd9ea9fab3f1d8d8db725bc1dbdf340c12a99bf5a1c04885d4be7f96a57031d01e2ad01362001fe01001501eead012dad044020121a0afead01fead0139ad887da06c7db4f837a07a414ba635d2c231beb6611d2be760bf21d552538ae44997e325f92e57035a010032aa01367e013ae404360100421d00363c005601004287014621052e2300119c321500a20100feaa01a2aa0182140b8821a0de44354b90a6b66d0f29bc9184562e21bbf06154721664fb26851f34dc06a5f8f97e3323090131112525760405325a0642ad01040040114bf201000588c20100362a02c9e2fead01a2ad01820405886aa06b9290a369a8592706dcfa45aad66ffa3467d003c3358fe04248d30e4165a26cf9caad0136f400469001050109255a1d001d0146360366010059082ead0135fe2e1500a20100fead01a2ad01825a038810a0cf9da45284a917021b168e41d5caa8bd3a2ad01c5a58751429f841503324e5fcf935ad32b50b3e0100311125105e5a0329a032010086ad017201004e3f0005830505c2010036a100fe5a03fe5a033e5a038857a0a2008890549979eb30a829cdeb4fd1331991436a74212266596639f30b20ba48f935adfec5174ac5170010366e01000436c7022e01004e96016e01003ead01297952010051685a0100fe5a03a25a0382b50b88b0a027d45b213546082fbac07c73b4b0a2dc87e2136e75aa0dda5e27a14d085449f2f9220b0a8e5a0300202525615a9992720100be850111013243014a01000588c20100fe5a03fe5a03765a03883fa07c26e8d793cf5250753a00755edd071cce7225d607749e6688a822e53ee64efcf9160b0aa6eb2e21aa3201006638014aaa017e850192010066720011013696010901361400698b328f00fe0c0f6e0c0f825e088044a06d152c5f9f6c6e8cf14f4694c9a9e169ccb43ce45f9583e958dee1b80124db2acc164657039d3e110b252536f4004a90011901721d00ea010005880d01119c04004016ab08327f01820100322e00fead016ead01825e088801a00c18826cd98791cf191b6f7434320b408377008abbe9f243f4fcff43d1f794e3f99eb106008025152525425a03660100fead018ead011101866c00366602fe5a03fe5a033e5a03882ca083593f6c054dec4ec0cc0b7b31bd1535cdbffce40f32e3fc8bab45c740b3672af99ead0109019aad0155ed8641012e0100293f3e010032fc020d010588c20100fead01fead0176ad018819a027017f84937a4d4295d3e8f0c4a9242ca7b590e6887c5481db4da5a394b5ef60f9225e082a0b0a460b01317e051a01f405098601003aad014e78017601005a68003e170056e701050111bb5a0100329300fe07056e0705820b0a889ea0faafbce4e603f5388afbfe285b8a69ecb92816f339512d736727164a98f01a6af9165e087aeb2e09010040212321aa19013a8d01360100721d0036010052180f5e400001871101358b2e1500a20100feaa01a2aa017eb106880bf0a0d4d7c27fbc2257dcedf05b47a611541fe7775a43a37956a07945bf244e916bb3662a1f32010031112510cab10636e00146010000409a050c11010588c20100368600698bfead01a2ad01820b0a8806a08fd30ab317475fb03919eecab7ffa1de9c1fc16e170a27d78fad8146f1254236f9d1b1cef22d32e9005201005e1a034e0100364b017601000e2a17c60100366200fead01fead013aad018876f3a0563ba448007eaa3f9f8f707c1c39e40310f0cd355160008d5ecca14844b0e9cffe9c35ae9c355e010036440115015a170005012e5a0371f632150072010029a70901327102feb1066eb10682070588dfa0393f0213247f895a40f1f3709fe1db25fbe9c65accafe9662b143f0e597feee5f9aeb10601dfae040500040131ea010005714601005a1700090162740036fc0129b0feaa01a2aa017e04058876e0a09a0bf9b4969ce9fbb5c659c59c5cf38072372e4150748e4a4a66fffe35925130feb106c5b1cd6e4a4201ae0405ae01004a6b008a0100001011aa0501fead01fead013ead0188dba0b2c80efe0934d52f70c18fa96e87fcd543da9cc6a4e34889437831cc64d03aadf94eb50b4601009168252536a1027201002dad49bf363537f2010005880d010164297952010011bb5a0100099b0d01fe04056e040582b50b888ca0eaacb272bbffcc41e9709014c1b926d689377fd1f0719c731547bb8544aaeb9af9fe0405b1044a140121467201008221005601002eaa014e01004a8b0042eb2929defeaa01a2aa0182040588c8a0efe1a90528737448dd0ba9ff5f1ad5d5ced73ecbf8dfd3f1f71b3881ce3819a3f91e080a2e0c0f46010009fd00202925aeb106464b0009016255067a01000d517ead01560100361004fead01fead013ead0188b5a03fae9cc95cc8fb82878490f359348ef22ad437479796ae3b47930b196a43293bf9a6ad0141842525e6ad01352e29fde601000588c20100157f0501fead01fead013ead0188a2a0c77940e8bf62e778494f4ec44b44bd7a01858acfaa1159e6ca16c23b5ee0f010f9a6ad01010125250df42d714dec560100721d00de5e031ec12e0d010d885ab50b299366010041831501feb1066eb10682b50b88cea03992a511416036f719cb28e798fedf453ccc5f1c6e9c1ff4b9533b47099063f6f9caad01925a0329a709061501ea9f013601004535820100328901feb406feb40682b406888fa021997c1773fcd3861ae1d87e3dafe557af1d72fe3d696c32c60a70f4e37f8decf9caad016d5a8e01003aad01313e00204ed0333a0100112c5201003ead016a40037579560100326700fe5a036e5a03820b0a887aa07af9556104d05d33f0a171f685cfea75d0db448ed79878a861c54318ca0fc7a7f935ad46741c1d0111f22525925a0309013aad01760100055d960100aa2b001d0136660225e1000432d1adfead016ead01820e0a887ca04a4f1addd725b15c5f525e07396baa925be440f6ffaf94a2efe39800381e8e52f935ad2a1a194601003dad002021ad9285010002ea7d377a0100fead0135adfe5a03a65a0382ad018877a0a331bb727ee86568324cb96818bce2b7dc6de3d954e2014265c1ab8f915bdcd3f9ca120ffe5a035e5a035a010049193216030001fead01fead01fead014ead018864a097dc76e20cb78f0834de23dd7c8d4cd6981551f1d4d85367c57b752bee4464eaf9be120f32350125496239012966fe01004601002e710071f30d1585db6201001a14131901feb106a2b106820b0a88bda07ac89d2fce7ac6a82e8db84fd698e50a75d59d447538a59e308dd756c65d13d0f9b504feb1066ab10625de764501ba01002ead017a01001d78058815010919fead01a2ad018204058051a0eaef69d8541cf7b3ed5e3573bf26eda2843752a62743caa851b3d300ff53292a8670a6ad0136f400723d03091daa5b013e010029524201002e52006d5a0004321500a20100fead01a2ad01825a0388aca022aa311e36b6915fae4658d1e466af00a736864d12625fd6d8ee89e2e64672fbf9feb1063ab1063a670429adfe01004601002ead01960100416201041901490821ad1518fe0b0af20b0a803ea091230f72faf0a4c75238d59b9a6e3de76180ee0a6bc79060cfc03b65ae24461e377796782101e915d986010039aa050a2117ee01006d42d19c1901297652010015340582420100329300feaa016eaa0182620d8868a0eb0828c038ff60e94fddda8b144544ad9634233e0da97cd48bdd61281a707496f9d5b19eb50b12c15825b58a01000002aeda014e01003aa70311019e800036010036660229e1fead01a2ad0182b106902ba0c21ada7e9ae4ae938ab79c4cf5d1cdf64eb4682fa5bc50ac3acd9c9be3835497f906a812074b4a70172e8a02519f252536f4002e2700420100721d000101da7b1205880d01119c3215005a0100469000fead01a2ad0182b106889da05ea3eb9118ad8cce0aa50abeeebf4413be0d6b90bab90918159922cbeec7adfbf9beb50baa5f0d00825a32016e010049ef7601002eaa016201004225003663020968feaa01a2aa018257038013a02ffbb2868a145601d903b3ae807d8b0e80170aaec4ab3e69976d8276ef87b116079808044b11164c4209c03eec0251b805fdaaaa0146c402fe010009010588c2010029aab15409eafeaa01feaa0139aa8818a0a449e0d0209cbce3dac8a8e399a5854dfa2cf09b214d21a678197ee3c2c08a5af961540805b96c29aa56010032aa0109f19201003aaa013217018201006a1a0529aa194f2976110732010011bb5a01001944fe125cfe125c885ea04257e3913c7774cd2ba2c517248818b4e98f18ac5ac5de2837c04604b8fef88cf92258089a5c0d00401258080d0121b76a530116d310fe01004e010029adbe010001af190129e1fead01a2ad018201058800a028bc7c01c927d50e920f38eee19ab3a7b10cf667609e2303912c9da54b5def95f9bead0116050a3e010009f94601003a5a035201009194a601000010fead01fead01fead014ead018875eda07e3d01cde93068674da233cb781a232a98b6bee4dfcb028c3c893d00612c6b2beed02916d0297201003aad0151c736e3024601007e200042ad01422d0279f0fe0705fe0705a20705884ca01c7eec43cc7f3f7870ba65f97e94d117f7285e2cef28096cb2360131ce1b6217f9c1b15e97892d0311ef857ca65b08aa40863ad4017a01000588c2010036010209db513d0501fe090f6e090f7e04058875daa04656fe329030e41febad141c9957463ac79c8a19cf762fd51b3f951b9960055c7ed0290dcc32ad0136f400726601721d00aa010000403afc062ead01119c321500a201000de10901fead016ead01825c0d888ca055f903480a4e4331ce90c8ab5c37c31c445a6915a6f7ef0b66d9ff3d8015c119f9d5b196b6102126a65a03fead0135ad3e010001871901360e006201000040366602fe5a03fe5a033e5a0388c7a01ef424fb9a3615645f199596af7e0b79fd1d9287a8b089f2137b1bba6e294e3ef9baad01210afead01aead01d9793201000588c2010021ad794a25ad00801910feb80b7ab80b82070588b4a05fedc045d6144cc74d2d2508846c615cb3f90945d37aa2f0ecba2f910f51985bf9d6ad014adf04958e2e01004a28005e8001b20100e6ad01190125ad3dbdfead01fead0188afa0c9b39ccfd6339dd965f8c6932c16cf45f2f8af326250d31c4e7c82a6e17cdc18f982141905d4318a2525aa5a0316064eae0100056f8201000588c20100615a1901096afe5a03fe5a03795a889ca0ccf12d6a5c3b0a62654fc8ee3aaa98ae5ebdcdecfc310ac64ead3f9aba1a070ff96e0b0a0d0132aa011df13ef6073e01004e5703e20100295b05012eaa01119c3215002e010072c30dfeaa01a2aa01825e08887ba0b40dc5f9b495856a95e4f830677ccbec8508ac8a028a1fe63cf1873dfb891989f9b5045ebc102570311125253dad7e0100053d3911321a01ee010005881d013dc836010016f4416a0100329300fe0b0a6e0b0a82c11a883aa03ba1a86917f002ced34d5b2ae96497652c574324ee6b3f2f007356ad54769e06f935ad960b0a01f7aa040529adfe01004601000588150100019a670036660229e129ad6d7dfead016ead01825e088889a0ac14ee798961ae1af206c1c123e94fce865330960da6756330ef9dd907216e0ef94ead01360b010101325a032dad8e22018e2400ce010046a2005201003a270066ad010d01fead01f2ad018876a0211dcac43bb53cbbda4da00393ec81b382020685dcf8763bf17f17354be2d20bf94ead0146010032ad0136f4002d903a18010d010d1d9a01005644004e01002e2a00119c2e15002e2000760100695a0d01fead016ead0182b406886aa0b79d4c1fbff47ba3558c18e01580287e9d34e3f411e6f1e814fd27c7eb2f4b86f9caad016d5a8e0100b6ad016201003252010101628d0135ba4e0100366602b907ad05fea18e76a18e8207058863a0cbaac987f9ac93e057f6bd67e1bbe6bb7f010ba9f0e95ddce64a337428ef71f3f932b80b82040105214ead01424f01090172ad01054dd60100d63b005ead011501fe5a036e5a0382ad018850a01c1fba12a871d7359caaddf1325d3250affa38981b060c4b1662b8c1f8d406bbf916b80b32a24e49731501000441ae01e8252201099a01003aaa015ad001c6010005881d013ab0002e010001bb6a0100329300feaa016eaa01820b0a8828a063074045a91fff1b86cae232cfdf6f0087abe26587b62e083d5dbc34d0666250f9d204052eff1195414e01002dad0d07fe010019013ead0196010036660229e1fead01a2ad01825703884ba0c3c4a2b78071a2380315e8a324f5f0b1f59d726c7adeafe44513657004f78375f9caad0136f400728901721d00ae01003a13022ead01753b2e15003201003a3d003201003dad0002fe5a03725a03825e088059a03e6bb43c0d4de9b68c829d8ddd8efdc0bde9db0df87b2560f984568b0b9236ae3c3c010125104eb1061d0125a10529fe7017327017359401010d5fba0100366602fe5a03fe5a033e5a038838a0ec0f85edbc71f9f9b40275db6b2e7f0906bf4728e1aa891b8c830957c4de3d86f9325e08420100311500800d1a05107aad012e010025b95201005dd2ca010005886a0100564c03fead01fead0176ad018825a0ee0be799aa3d4dcceca75605f73996d3e6571f787589d5f1add0d2b9b358aeccf9165e08de2a2d668d016957563501fa01002eaa0100801e5c0d2e150072010069510901323202fe5e086e5e088204058848a08d6cdd47d56c13b26c89af3181041c84ed33c1aee629eba6071d5e24cc07a205f9cab106fe570365575ac501323c01660100004071e8b20100fe5703fe57037657038812a04505771ae6ae1ed69994bac9ee67b34e8af3dadf9784044210df320e3e6e15a6f952ad012e7b020501311c45bd36f400725b033a7703828b019e870305881d0142b100190111bb5a0100329300fe5a036e5a0382b80b8816a01a3f46c88375f26b735b3ff10f9a515dbfbfe0ce3ce32498e45a3d48b93ab878f952ad0142010011f225257d5a7e5d013aad010d01561600ae010005887e010042c201366602091ffead01a2ad017eb80b8874ffa09283b24ed216acd6bc60400db6b6dd7628c7538515f3106b5f9f5aaffcdf1ab27e28230d0132ad0136f400567a010d160d073e0100364200ca01002ead010d9c000832150038000000000000000000000000000000000062010000082e1a00f03cf89df89b947ef66b77759e12caf3ddb3e4aff524e577c59d8df863a08a22ee899102a366ac8ad0495127319cb1ff2403cfae855f83a89cda1266674da02e49004a01000403a04a15001901c05c0b39a0e3b9a4edcd4a9e0d7cc302d376eacb21487e3d1ba990ec7dae37bfda16a5f350f90354f901a70183016e1bb901193b0d0100800d081509004001110050010596010000024227000004421200560100056a620100761e005e010000103219000020050efead01a2ad01002a76ad01b8bc74e7a04f1b9fe9e450e5acf13342e591f2af8f104071008c1fb678736488d37d6c27fff901a7018302dc76b9010005bc4e010031b3252276aa0129010d0146aa01760100323d006a010005882e01003685015a0100362500096cfeaa01feaa0139aa90eca0b397ca1eee35427f9efb9482efae35a4aa8c52d3e9a13c126448a5daa338ad5cf901aa6d57005b32570309ca1501aaad01320100bead016a010032900342ad010000367601560100fead01fead0176ad0188d4a0110b5fe013dbe95a51f09438102f17849d2857c13fe27ce6cca003da584720c8f95aad013a010032ad010014321d00729001721d00ea01002ead01119c3215000501369d014a010000013ae401feb106f2b1068828a0179dcaac4709a2f6e1690264456368ef5a40c53126e731f3e8396e88698d88c1f9caad0182040119013aad01327404ee010008400008325b003a09042e010031cc329a031901329300fead016ead01000476b1069048d104a04e0c051a9913bec4cc9e8acd3209ce6c32391ed2b4bb0293a76216876ffee0aef9caad0172b40632fd003ead01fe010015012e5a036a6b0701013dd536660229e132b000fead016ead01825e0888c1a03aa540e8a0bf0a394329ac33ed262c39e629d5387fe0a351afb3059ad656139df9fead0136ad013e39013d2a460100292ed201002ead01a601007aad010004fead01f6ad0188aea0aa1d7d585af4a8235cb88ec780bc1967ba7f2aac1f119b990e1e23ec3afbbc84f9caad0136f400729001621d005a95049e01002ead0191e83215007a01001940000a2e2a00fe5a036e5a0382650d8817a078664d6a629175dc4bbeb8c0d036e8a2427fda505f02db7fdef919bd915f2a49f9eead0125ad2e0100422c033aad010008327504ea0100396d090142790019010080761802329200fead016ead017eb40698d0faa0ae5a94b192d11f3e9d32e08d1122da485a5ca18bf2f2befa32b5284b81269f3cf901aaf90e680d00014e120f000495d651be252572b4063601003aad01fe010015010588c20100951305d829e1fead01a2ad0182b406889ba0db164b367f882c008c7f2197335e127549073995ba1e3e121b39159d0d13a7cbf922bf1036680d3a010032ad0115f400000ed810729001721d007601007290012e1d00119c3215009e01000004fead01a2ad018207058806a022a5e05afa58b31f4ce9548475e656b3febed7ebecc195b9fd3dfebfc323e5d8f961570802dc3632120f3a0100310e2522fe570352570389aa11687e010005880501ae0c022e63020000fe5703fe57034257038888a04784718c4e38000382420c3240440015932da9a2f9f932b7031318517bf9b7a7f932b10639043a0100314505216aad01360f01feb80b4eb80b0001059a0588c20100369e00fe0405fe04053e04058883a02faf90ca35ac0a0aa0902123164f9861b2448ce2b823fd84fb3ded840b2ecf71f935ad001b755a09c63201009ead013e0100aef802320100329b040d0111850000d6ef040000fead01fead017aad018870a0101003cbed3c5a48b6b0e6eb6c021cd2ccd31c39de630ae6f903d310741d5c00f9cab1066a5a033e0100a6ad01a9077201001d4d7e5a031d2b1d01fe5a03fe5a03765a03885da02e29a1121a353fd78f03f71e93d75483c1c017ca176342d605d17c995184f6bff9c9b100b67557320100897451d2252236f1007201003a32014e2d038e010009851d0105881d010020421200150111bb5a0100329300feb50bf2b50b88e8a044db790fa815dd9ace6312c8325c017abbe39556144ea00659d3d602d92ac2e1f94a04054a010011f2252535ad650b3a9001360100721d0036010032910111705e010005880d01152c2e1500a20100fead01a2ad017e080a880af5a0ed8943b28f06b00ec8e43c4348a1803a98c6d035f4fea125f0a3ed004aafacb526620da6b50ba904921b013aad014a0b077a01005a66005a17007a010055660501098dfead01a2ad0182620d884aa0ae6a1bce3b16c231842970014b011537526d1e6dd0216ee739dce4ecc8d48acef9755abead019201003aad011101322201ce01005ead017659002ead010010fead01fead0142ad018437a0342f62e3abb0c095d7477b22104b877fb16df01a705fcbc3ccf1b2f95a10ae3e0000");
        IByteBuffer input = PooledByteBufferAllocator.Default.Buffer();
        ZeroPacket output = null;
        try
        {
            input.EnsureWritable(frame.Length);
            input.WriteBytes(frame);

            ZeroFrameMergerTestWrapper zeroFrameMergerTestWrapper = new();
            output = zeroFrameMergerTestWrapper.Decode(input);
            Assert.That(output, Is.Not.Null);

            Assert.That(output.PacketType, Is.EqualTo(32));
            output.Content.ReadAllBytesAsArray();
        }
        finally
        {
            output?.Release();
            input.Release();
        }
    }
}
